const { Sequelize } = require('sequelize')
const { PropertyModel, EvaluateModel } = require('../../models/index')

// 获取柱状图所需数据
const getBarChartData = async (req, res) => {
  try {
    // 使用sequelize里的group和count方法来获取按类型分类的房源数量
    const result = await PropertyModel.findAll({
      attributes: ['room_type', [Sequelize.fn('COUNT', Sequelize.col('id')), 'count']],
      group: ['room_type'],
      raw: true, //获取原始结果
      order: [['count', 'DESC']]
    })

    // 将结果转换为图表库可以理解的格式
    const chartData = result.map(item => {
      return {
        type: item.room_type,
        count: item.count
      }
    })

    // 返回成功响应
    res.status(200).json({
      title: '柱形图数据',
      data: chartData
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 获取饼图所需数据
const getPieChartData = async (req, res) => {
  try {
    // 使用sequelize里的group和count方法来获取按类型分类的房源数量
    const result = await EvaluateModel.findAll({
      attributes: ['rating', [Sequelize.fn('COUNT', Sequelize.col('id')), 'count']],
      group: ['rating'],
      raw: true, //获取原始结果
      order: [['count', 'DESC']]
    })

    // 将结果转化为图标库理解的格式
    const chartData = result.map(item => {
      return {
        type: item.rating,
        count: item.count
      }
    })

    // 返回成功响应
    res.status(200).json({
      title: '饼图数据',
      data: chartData
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 获取折线图所需数据
const getLineChartData = async (req, res) => {
  try {
    const result = await PropertyModel.findAll({
      attributes: ['city', [Sequelize.fn('AVG', Sequelize.col('price')), 'average']],
      group: ['city'],
      raw: true, //获取原始结果
      order: [['average', 'DESC']]
    })

    // 房源价格保留两位小数
    result.forEach(item => {
      item.average = parseFloat(item.average).toFixed(2)
    })

    // 返回成功响应
    res.status(200).json({
      title: '折线图数据',
      data: result
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

module.exports = {
  getBarChartData,
  getPieChartData,
  getLineChartData
}